package cn.lizemin.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author lzm
 * @version 1.0
 * @description: 测试服务熔断机制
 * @date 2022/3/7 14:36
 */
@RestController
public class DemoController {

    @GetMapping("demo") //?id=1
    @HystrixCommand(fallbackMethod = "demoFallBack")//熔断之后处理 fallbackMethod 书写快速失败方法名
    public String demo(Integer id){
        System.out.println("demo ok !!!");
        if(id <= 0){
            throw new RuntimeException("无效id!!!!");
        }
        return "demo ok !!!";
    }

    /**
     * 当该接口发生异常后，使用默认的备选方法
     * @param id
     * @return
     */
    @GetMapping("demo1") //?id=1
    @HystrixCommand(defaultFallback = "defaultFallBack")//熔断之后处理 defaultFallback 书写默认失败后的备选方法名
    public String demo1(Integer id){
        System.out.println("demo1 ok !!!");
        if(id <= 0){
            throw new RuntimeException("无效id!!!!");
        }
        return "demo1 ok !!!";
    }

    /**
     * 用来测试hystrix仪表板上的断路器状态
     * @return
     */
    @GetMapping("/demo2")
    @HystrixCommand(defaultFallback = "defaultFallBack")
    public String demo2(){
        System.out.println("demo2 ok!!");
        return "demo2 ok !!!";
    }


    /**
     * 自己备选处理
     * 需要注意的是：备选方法的参数类型，参数个数，以及方法的返回值要和原方法保持一致
     * @param id
     * @return
     */
    private String demoFallBack(Integer id){
        return "当前活动过于火爆,服务已经被熔断了!!!";
    }

    /**
     * 默认的备选方法, 相当于是全局的，任何接口方法只要除了异常，都会走这个方法，相当于这是所有方法抛异常
     * 后的备选方法
     * 使用默认方法的好处是：不需要为每个接口都提供相应的备选方法，减少了开发工作量
     * @return
     */
    public String defaultFallBack(){
        return "网络连接失败,请重试!!!";
    }

}
